package november.hashtable;

class EmpLinkedList {
    //头节点,指向第一个
    public Emp head;

    public void add(Emp node) {
        if (head == null) {
            head = node;
            return;
        }

        Emp temp = head;

        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = node;
    }

    public void delete(int id) {
        if (isEmpty()) {
            System.out.println("链表为空");
            return;
        }

        //如果删除头节点
        if (head != null && head.id == id) {
            //头节点直接指向头节点的下个节点
            head = head.next;
            return;
        }

        Emp temp = head;
        boolean flag = false;//是否找到
        //temp记录要删除的元素的前一个节点
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.next.id == id) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            //把temp.next的指针指向temp.next.next , 原来的temp.next(要删除的元素)则会自动回收
            temp.next = temp.next.next;
        } else {
            System.out.println("没有找到该节点");
        }
    }

    /**
     * 修改节点
     */
    public void update(Emp update) {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }

        Emp temp = head;
        boolean flag = false;//是否找到
        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.id == update.id) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.name = update.name;
        } else {
            System.out.println("没有找到该节点");
        }
    }


    /**
     * 修改节点
     */
    public Emp findById(int id) {
        if (isEmpty()) {
            System.out.println("链表为空");
            return null;
        }

        Emp temp = head;

        Emp result = null;
        while (true) {
            if (temp == null) {
                //遍历到链表尾,找不到对应元素
                result = null;
                break;
            }
            if (temp.id == id) {
                //找到对应元素
                result = temp;
                break;
            }
            temp = temp.next;
        }
        return result;
    }


    public int count() {
        if (head == null) {
            return 0;
        }
        int count = 0;
        Emp temp = head;
        while (temp != null) {
            count++;
            temp = temp.next;
        }
        return count;
    }


//    /**
//     * 根据排序规则插入
//     *
//     * @param node
//     */
//    public void addByBiPredicate(Emp node) {
//        //第一次插入
//        if (head.next == null) {
//            head.next = node;
//            return;
//        }
//        Emp temp = head;
//        boolean flag = false;
//        //链表不为空
//        while (true) {
//            if (temp.next == null) {
//                break;
//            }
//            //根据传入的排序规则判断
//            if (biPredicate.test(temp.next, node)) {
//                break;
//            }
//
//            if (temp.next.id == node.id) {
//                flag = true;
//                break;
//            }
//            temp = temp.next;
//        }
//
//        if (flag) {
//            System.out.println("插入的id重复");
//            return;
//        }
//        node.next = temp.next;
//        temp.next = node;
//    }


    //打印链表
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        if (isEmpty()) {
            sb.append("链表为空");
            return sb.toString();
        }
        //从头节点开始打印链表
        Emp temp = head;
        do {
            sb.append(temp.toString());
            sb.append("\n");
            temp = temp.next;
        } while (temp != null);
        return sb.toString();
    }

    public void show(int no) {

        StringBuilder sb = new StringBuilder();
        if (isEmpty()) {
            System.out.println("第" + no + "条链表为空");
            return;
        }

        System.out.print("第" + no + "条链表信息为 => ");

        //从头节点开始打印链表
        Emp temp = head;
        do {
            sb.append(temp.toString());
            sb.append("\n");
            temp = temp.next;
        } while (temp != null);

        System.out.println(sb);
    }

    private boolean isEmpty() {
        return this.head == null;
    }
}
